package com.example.deepseek.controller;

import com.example.deepseek.model.ChatSession;
import com.example.deepseek.model.Message;
import com.example.deepseek.service.ChatSessionService;
import com.example.deepseek.service.DeepseekService;
import com.example.deepseek.service.FileService;

import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Controller
@RequestMapping("/api/files")
@RequiredArgsConstructor
@Slf4j
public class FileController {

    private final DeepseekService deepseekService;
    private final FileService fileService;
    private final ChatSessionService chatSessionService;

    @PostMapping("/upload/{sessionId}")
    @ResponseBody
    public ResponseEntity<Map<String, String>> uploadFile(
            @PathVariable String sessionId,
            @RequestParam("file") MultipartFile file) {

        Map<String, String> response = new HashMap<>();

        try {
            log.info("开始处理文件上传: {}, 大小: {} 字节, 类型: {}",
                    file.getOriginalFilename(), file.getSize(), file.getContentType());

            // 保存文件
            String filePath = fileService.storeFile(file);
            log.info("文件已保存到: {}", filePath);

            // 读取文件内容
            String fileContent = fileService.readFileContent(filePath);
            log.info("文件内容读取完成，长度: {} 字符", fileContent.length());

            // 添加验证，确保文件内容被提取
            if (fileContent.isEmpty() && file.getSize() > 0) {
                log.warn("文件内容为空，但文件大小不为零，可能存在文本提取问题");
                response.put("warning", "文件似乎无法提取文本内容，可能是扫描件或图像PDF");
            }

            // 获取当前会话
            ChatSession session = deepseekService.getSession(sessionId);
            if (session == null) {
                response.put("error", "会话不存在");
                return ResponseEntity.badRequest().body(response);
            }

            // 添加文件上传消息
            Message userMessage = new Message("user", "上传文件: " + file.getOriginalFilename());
            session.addMessage(userMessage);
            chatSessionService.addMessage(sessionId, userMessage);

            // 添加文件内容作为系统消息
            String fileInfo = "文件名: " + file.getOriginalFilename() +
                    "\n文件类型: " + file.getContentType() +
                    "\n文件大小: " + file.getSize() + " 字节";

            Message systemMessage = new Message("system", fileInfo);

            // 修复：将字符串转换为字节数组
            if (fileContent != null) {
                systemMessage.setTextContent(fileContent); // 使用新添加的文本内容字段
            }

            systemMessage.setFilePath(filePath); // 保存文件路径
            systemMessage.setFileName(file.getOriginalFilename()); // 保存文件名

            log.info("创建系统消息，文件名: {}, 内容长度: {}",
                    systemMessage.getFileName(),
                    systemMessage.getTextContent() != null ? systemMessage.getTextContent().length() : 0);

            session.addMessage(systemMessage);
            chatSessionService.addMessage(sessionId, systemMessage);

            // 返回成功信息，但不触发分析
            Message assistantMessage = new Message("assistant",
                    "已上传文件: " + file.getOriginalFilename() + "\n\n您可以输入指令告诉我如何处理这个文件，例如：\n" +
                            "- 分析整个文件内容\n" +
                            "- 提取文件中的关键信息\n" +
                            "- 对文件中的特定部分提问\n" +
                            "- 或者任何其他与文件相关的问题");

            session.addMessage(assistantMessage);
            chatSessionService.addMessage(sessionId, assistantMessage);

            // 通过WebSocket发送消息
            deepseekService.sendWebSocketMessage(sessionId, assistantMessage);

            response.put("status", "success");
            response.put("filename", file.getOriginalFilename());
            response.put("filePath", filePath);
            response.put("contentLength", String.valueOf(fileContent.length()));

            return ResponseEntity.ok(response);

        } catch (IOException e) {
            log.error("文件上传失败", e);
            response.put("error", "文件上传失败: " + e.getMessage());
            return ResponseEntity.badRequest().body(response);
        }
    }

    @PostMapping("/upload-multiple/{sessionId}")
    @ResponseBody
    public ResponseEntity<Map<String, String>> uploadMultipleFiles(
            @PathVariable String sessionId,
            @RequestParam(required = false) String message,
            @RequestParam("files") List<MultipartFile> files) {

        Map<String, String> response = new HashMap<>();

        try {
            // 获取当前会话
            ChatSession session = deepseekService.getSession(sessionId);
            if (session == null) {
                response.put("error", "会话不存在");
                return ResponseEntity.badRequest().body(response);
            }

            if (files.isEmpty()) {
                response.put("error", "没有找到上传的文件");
                return ResponseEntity.badRequest().body(response);
            }

            // 构建用户消息内容
            StringBuilder userContent = new StringBuilder();
            if (message != null && !message.isEmpty()) {
                userContent.append(message).append("\n\n");
            }

            userContent.append("上传了").append(files.size()).append("个文件：\n");

            // 处理所有文件
            List<String> filePaths = new ArrayList<>();
            StringBuilder fileContents = new StringBuilder();

            for (MultipartFile file : files) {
                // 保存文件
                String filePath = fileService.storeFile(file);
                filePaths.add(filePath);

                // 添加文件信息到用户消息
                userContent.append("- ").append(file.getOriginalFilename())
                        .append(" (").append(formatFileSize(file.getSize())).append(")\n");

                // 读取文件内容
                String content = fileService.readFileContent(filePath);

                // 添加文件内容到合并内容
                fileContents.append("===== 文件：").append(file.getOriginalFilename()).append(" =====\n\n")
                        .append(content).append("\n\n");
            }

            // 添加用户消息
            Message userMessage = new Message("user", userContent.toString());
            session.addMessage(userMessage);
            chatSessionService.addMessage(sessionId, userMessage);

            // 添加系统消息包含文件内容
            Message systemMessage = new Message("system", "文件内容：\n\n" + fileContents.toString());
            session.addMessage(systemMessage);
            chatSessionService.addMessage(sessionId, systemMessage);

            // 要求AI分析文件
            deepseekService.analyzeMultipleFiles(sessionId, fileContents.toString(), files.size());

            response.put("status", "success");
            response.put("filesCount", String.valueOf(files.size()));
            return ResponseEntity.ok(response);

        } catch (Exception e) {
            log.error("多文件上传失败", e);
            response.put("error", "文件上传失败: " + e.getMessage());
            return ResponseEntity.badRequest().body(response);
        }
    }

    /**
     * 格式化文件大小
     * @param size 字节数
     * @return 格式化后的文件大小字符串
     */
    private String formatFileSize(long size) {
        if (size < 1024) {
            return size + " 字节";
        } else if (size < 1024 * 1024) {
            return String.format("%.2f KB", size / 1024.0);
        } else if (size < 1024 * 1024 * 1024) {
            return String.format("%.2f MB", size / (1024.0 * 1024));
        } else {
            return String.format("%.2f GB", size / (1024.0 * 1024 * 1024));
        }
    }
}